package com.yowasa.xiuxian.entity.enums;

import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

@Getter
@AllArgsConstructor
public enum IntentsEnum {
    GUILDS(1 << 0, "频道管理消息"),

    GUILD_MEMBERS(1 << 1, "频道成员消息"),

    // 消息事件，仅 *私域* 机器人能够设置此 intents。
    GUILD_MESSAGES(1 << 9, "频道消息"),

    GUILD_MESSAGE_REACTIONS(1 << 10, "反馈消息"),

    DIRECT_MESSAGE(1 << 12, "私信消息"),

    OPEN_FORUMS_EVENT(1 << 18, "论坛消息"),      // 论坛事件, 此为公域的论坛事件

    AUDIO_OR_LIVE_CHANNEL_MEMBER(1 << 19, "音视频成员进出消息"),  // 音视频/直播子频道成员进出事件

    INTERACTION(1 << 26, "互动事件创建消息"),

    MESSAGE_AUDIT(1 << 27, "审核消息"),

    FORUMS_EVENT(1 << 28, "论坛事件消息"),  // 论坛事件，仅 *私域* 机器人能够设置此 intents。

    AUDIO_ACTION(1 << 29, "音频消息"),

    PUBLIC_GUILD_MESSAGES(1 << 30, "公域消息"), // 消息事件，此为公域的消息事件


    ;
    private int code;
    private String desc;

    //是否包含枚举值
    public static boolean isHasFlag(final Integer flag, final IntentsEnum intent) {
        if (Objects.isNull(flag) || Objects.isNull(intent)) {
            return false;
        }
        int code = intent.getCode();
        //一个整数 按位与自身 = 自身值
        return (code & flag) == code;

    }

    //获取命中枚举列表
    public static List<IntentsEnum> getHitFlags(final Integer flag) {
        if (Objects.isNull(flag)) {
            return Collections.emptyList();
        }
        List<IntentsEnum> hitFlags = Lists.newArrayList();
        for (IntentsEnum value : values()) {
            int code = value.getCode();
            //传入给定整数和任意一个枚举项进行按位与运算
            if ((code & flag) == code) {
                //结果等于枚举项本身，说明flag中有此枚举项
                hitFlags.add(value);
            }
        }
        return hitFlags;
    }

    public static int calculateFlag(List<IntentsEnum> intents) {
        if (CollectionUtils.isEmpty(intents)) {
            return 0;
        }
        int value = 0;
        for (IntentsEnum propertyFlag : intents) {
            value |= propertyFlag.getCode();
        }
        return value;
    }

    public static int myIntents() {
        return calculateFlag(Lists.newArrayList(
                GUILDS,
                GUILD_MEMBERS,
                GUILD_MESSAGES,
                DIRECT_MESSAGE
        ));

    }


}
